/**  
* @Title: WxUtil.java
* @Package com.lemon.utils.wx
* @Description: (一句话阐述):
* @author Ran_cc
* @date 2018年8月8日
* @version V1.0  
*/
package com.lemon.utils.wx;

import java.io.UnsupportedEncodingException;
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.spec.InvalidParameterSpecException;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.Arrays;
import org.codehaus.xfire.util.Base64;

import com.alibaba.fastjson.JSONObject;
import com.lemon.utils.HttpUtil;

/**
 * <p>Title: WxUtil</p>
 * <p>Description: 
 * </p>
 * <p>Company: </p>
 * @author Ran_cc
 * @date 2018年8月8日
 * @版本 V 1.0 
 */
public class WxUtil {

	private static final String APPID = "wxabde417d36f17e18";
	private static final String APPSECRET = "d401e2495e77cebe2138ac446878f619";
	private static final String GRANTTYPE = "authorization_code";

	public static JSONObject getWxOpenId(String code) {

		String url = " https://api.weixin.qq.com/sns/jscode2session";
		Map<String , String> map = new HashMap<String , String>();
		map.put("appid" , APPID);
		map.put("secret" , APPSECRET);
		map.put("js_code" , code);
		map.put("grant_type" , GRANTTYPE);
		String doGet = HttpUtil.doGet(url , map);
		System.out.println(doGet);
		JSONObject parse = (JSONObject) JSONObject.parse(doGet);

		return parse;
	}

	public static JSONObject getWxUserInfo(String code , String iv , String encryptedData) {

		JSONObject jb = getWxOpenId(code);

		// 被加密的数据
		byte[] dataByte = Base64.decode(encryptedData);
		// 加密秘钥
		byte[] keyByte = Base64.decode(jb.getString("session_key"));
		// 偏移量
		byte[] ivByte = Base64.decode(iv);
		try {
			// 如果密钥不足16位，那么就补足.  这个if 中的内容很重要
			int base = 16;
			if (keyByte.length % base != 0) {
				int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
				byte[] temp = new byte[groups * base];
				Arrays.fill(temp , (byte) 0);
				System.arraycopy(keyByte , 0 , temp , 0 , keyByte.length);
				keyByte = temp;
			}
			// 初始化
			Security.addProvider(new BouncyCastleProvider());
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding" , "BC");
			SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
			AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
			parameters.init(new IvParameterSpec(ivByte));
			cipher.init(Cipher.DECRYPT_MODE , spec , parameters);// 初始化
			byte[] resultByte = cipher.doFinal(dataByte);
			if (null != resultByte && resultByte.length > 0) {
				String result = new String(resultByte, "UTF-8");
				return (JSONObject) JSONObject.parse(result);
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidParameterSpecException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (InvalidAlgorithmParameterException e) {
			e.printStackTrace();
		} catch (NoSuchProviderException e) {
			e.printStackTrace();
		}
		return null;
	}

}
